C L A C O M Communications Library For Clarion For DOS Copyright (C) 1993 - 1995 by GAP Development Company. ALL RIGHTS RESERVED. No part of this manual shall be reproduced, stored in a retrieval system, or transmitted by any means, electronic, mechanical, photocopying, recording, or otherwise, without written permission from GAP Development Company. While every precaution has been taken in the preparation of this manual, GAP Development Company assumes no responsibility for errors or omissions. Neither is any liability assumed for damages resulting from the use of the information contained herein. CLACOM is the sole and exclusive property of GAP Development Company. It is licensed and not sold to the end user with restrictions placed upon its use. CLACOM is copyrighted by GAP Development Company. Clarion and Clarion For DOS are trademarks of Clarion Software Corporation. DESQview is a trademark of Quarterdeck. DigiBoard is a trademark of DigiBoard Incorporated. Contents Description 5 Major Features 5 Getting Started 6 Integrating with Clarion 7 Overlays - Protected Mode 8 Communications Interface 10 Key Codes 13 Port Initialization 15 Input & Output 19 File Transfers 23 Capture Buffers 26 Sample Application 28 Global Variables 31 Functions - Quick Reference 32 Page 3 Functions - Detailed Reference 34 Appendix A 93 Appendix B 96 Index 97 Page 4 GAP Communications CLACOM Description CLACOM is a professional communications library for programmers using the Clarion For DOS. It allows you to integrate interrupt driven, asynchronous communications into your Clarion programs. CLACOM includes robust Communications routines which are fully interrupt driven. Written in highly optimized assembler, they are capable of operating at any speed which the UART on an IBM type of computer is capable of producing. The FIFO buffers in the 16550 UART are fully supported. Hardware flow control (CTS/RTS checking) is automatic. ANSI Terminal Emulation is fully integrated into CLACOM, as are the most popular File Transfer protocols. In addition, the Clarion GUI Kit is supported for Graphics applications. Major Features ù Supports the FIFO buffers of the 16550 UART chip. ù Speeds up to 115,200 baud. ù Supports COM 1 through COM 8 as well as Intelligent DigiBoards using a Direct Programming Interface or a DigiBoard Device Driver. ù Up to 8 ports can be opened simultaneously (16 ports when using a DigiBoard). ù Supports Hardware Flow Control (CTS/RTS), automatically. ù Fully self contained, built in ANSI driver for IBM ANSI Terminal Emulation. ù File transfer protocols include - ASCII, Xmodem, Xmodem- CRC, 1K Xmodem, 1K Xmodem-G, Ymodem, Ymodem-G, and Zmodem. ù Works with programs compiled as Static, Overlay, Overlay with DLL, Protected, and Protected with DLL. ù Extremely easy interfacing with Clarion programs. Page 5 GAP Communications CLACOM Getting Started First a note about this documentation. This Text Based manual is similar in content to the Printed Manual except that it lacks formatting and graphics, and is not as up to date. Some screens can not be reproduced in a document such as this. Font sizes can not be changed when necessary since there is no way of knowing what kind of printer this document will be printed with. The Printed Manual is designed in such a way that it is easy to read and it is easy to find the information you may be looking for. We are unable to do the same with this text based manual. If the documentation references a screen, you will need to run the Example program to see the screen, since we are unable to reproduce it in this Text Based manual. The following files are part of the CLACOM distribution set: CLACOM.TXT - Text Based documentation. Not part of Registered version since its not needed. DXVCLOM.LIB - Library routines for Statically linked Clarion APP. DOVCLCOM.LIB - Library routines for Overlayed Clarion APP. DDVCLCOM.LIB - Library routines for Overlayed Clarion APP using Run Time Librares. DESCLCOM.LIB - Library routines for Protected mode Clarion APP using Run Time Libraries. (1) DEVCLCOM.LIB - Library routines for Statically linked Protected mode Clarion APP. (1) CLACOM.OBJ - Stub for including Module Definitions. CLACOM.INC - Module Structure Include file. GTERM.ZIP - Terminal Emulation example with Clarion source. RESETDIG.ZIP - Program used to reset a DigiBoard COM/Xi. The .OBJ, .LIB and .INC files should be placed in the same directory where the program you intend to use them with resides. GTERM.ZIP contains a Terminal Emulation Clarion Application. It should be placed in its own directory along with the above .OBJ, .LIB and INC files. (1) Protected Mode Libraries are not included with Shareware version of CLACom. Page 6 GAP Communications CLACOM Integrating with Clarion To tell your Clarion Application that you are using the CLACOM library, follow these steps: Load or Create your application. From the View Menu, select Module View. Select Insert from the Edit Menu. The Module Properties screen will appear. For the Module Name, type CLACOM.OBJ. Select the External Object Module radio button. For the Module Structure Include File, type CLACOM.INC. Select OK. CLACOM.OBJ is a dummy module. It contains no code or data. Its sole purpose is to include the CLACOM procedure definitions. You must now edit the Project File and include the five CLACOM libraries. The five libraries are identical with the exception that they were compiled using one of the five Clarion memory models : Static, Overlayed, Overlayed/Runtime, Protected, and Protected/Runtime. Select the Project Menu. Select Change Project File. Select the Module button and then the Insert button. For the Module Name, type: %CLAPFX%CLCOM.LIB Select the External OBJ/LIB Radio button. Finally, save the Project File changes. Your Clarion application is now fully aware of the CLACOM library routines and you will be free to use one of the five standard Memory Models without having to worry about which CLACOM library to use. Page 7 GAP Communications CLACOM Overlays - Protected Mode You must perform one final step before generating your CLACOM application. The Standard Communications interface takes over the interrupt vector for the selected COM Port. This means that the interrupt service routine can not be swapped out. It must remain in memory at all times. The same is true if you enable the Ctrl-Break intercept routine (which you should). In order to keep the Communications routines in memory and prevent them from being swapped out, you must provide an Export File for the Linker so that it can determine how segments are to be loaded. Copy the GTERM.EXP file to your application's directory, renaming it in the process by giving it the same base name as your application's EXE file and with an .EXP extension. GTERM.EXP -->> .EXP This file MUST be in the same directory that your application is in. Please do not take the above change lightly or forget to make it. Failure to add the above lines will cause your program to crash as soon as the communications routines are swapped out of memory. This is especially important for Protected Mode programs as you want the Communications routines to remain FIXED in memory. Be sure to name this file correctly or the Project System will not use it. Its base name (the first 8 characters) is the same as your application's EXE name (not necessarily the name of the Application, but the name that the resultant EXE will be named when it is created). Its 3 character extension is "EXP". For instance, in the GTERM sample application, the name of its Export File is GTERM.EXP. If your Overlayed or Protected Mode application locks up the computer, causes an XTRACE, or causes an Exception Error, and you can attribute the problem to CLACOM, check your application's directory for the presence of the Export File. By simply making a copy of GTERM.EXP, you can't go wrong. Page 8 GAP Communications CLACOM Communications Interface CLACOM supports three serial port interfaces: STANDARD DIGIBOARD INT14/EBIOS The Standard interface is used when working with the standard COM1 thru COM4 serial ports on the Host computer. This will be the interface most often used. If an end user is using a DigiBoard then either the DigiBoard or Int14/EBIOS interface may be selected. Most DigiBoard users will use the Int14/EBIOS interface. All input/output to the DigiBoard is performed via Interrupt 14 calls and a Device Driver (supplied by DigiBoard) handles the interface between the program and the board. The DigiBoard interface uses Direct Programming. CLACOM talks to the board directly without the need for a Device Driver. In order to use this interface, a program called RESETDIG.EXE must be used in the AUTOEXEC.BAT file to reset the DigiBoard once when the computer is first booted. This program is supplied as part of the CLACOM package and may be freely distributed to your end users. In order to determine which interface your end users require, you should provide a Hardware screen similar to the following: SCREEN NOT AVAILABLE IN TEXT BASED DOCUMENTATION SEE PRINTED MANUAL If the Standard Interface is selected, the Ports Button should be enabled, the DigiBoard Button disabled, and if the Ports Button is selected, a screen similar to the following should be displayed: SCREEN NOT AVAILABLE IN TEXT BASED DOCUMENTATION SEE PRINTED MANUAL Page 9 GAP Communications CLACOM If the DigiBoard or Int14/EBIOS Interface is selected, the Ports Button should be disabled, the DigiBoard Button enabled, and if the DigiBoard Button is selected, a screen similar to the following should be displayed: SCREEN NOT AVAILABLE IN TEXT BASED DOCUMENTATION SEE PRINTED MANUAL On the Hardware Screen, if the DigiBoard or Int14/EBIOS Interface is selected, then the Port Radio Buttons should be disabled. On the Port Assignments Screen, the Base and IRQ fields for COM 1 _ and COM 2 should be marked as "Skip". The reason for this is that it makes no difference what a user types into these fields since the standard Base Address and IRQ for these two ports will be used. On the DigiBoard Parameters Screen, the fields that need to be disabled depend upon the Interface. If the Interface is DigiBoard, then the Memory Window and I/O Port Buttons are valid, as is the Channel Number field. Channel Numbers for the Direct _ Interface generally range from 1 to 16. The sample screens show the valid Window and I/O Port address for a DigiBoard. If, however, the Interface is Int14/EBIOS, the Memory Window and I/O Port Buttons should be disabled. Only the Channel Number field should be selectable. The Int14/EBIOS Interface uses the DigiBoard supplied Device Driver and it already knows what the addresses for the board are, so these Radio Buttons are not needed for this Interface. Channel numbers for this Interface __ generally range from 4 to 19 (0 - 3 are reserved for COM1 - COM4). Don't try to do range checking on the DigiBoard Channel Numbers. These boards are produced in several varieties from 2 ports, 8 ports, up to 16 ports. An end user that is using a DigiBoard will likely know what Channel Number is being configured. When using the DigiBoard Interface an end user that is using a DigiBoard will also know what Memory Window and I/O Port address the board was configured for when the board was installed. The valid addresses are contained in the DigiBoard manuals and are shown on the sample screens. Page 10 GAP Communications CLACOM Keep in mind that in order to use the DigiBoard Direct Interface, your end users must run the supplied RESETDIG.EXE program in their AUTOEXEC.BAT files. This program makes sure the DigiBoard is reset and able to accept commands when the computer is powered on. It resets all of the Channels on the board, which is why it _ is run only once. Page 11 GAP Communications CLACOM Key Codes CLACOM includes a function called GetKeyc. If your application needs to send key codes that were generated from the local keyboard out the Communications Port to a remote computer you need to use this function to gather input from the local keyboard. Clarion's keyboard routines can not be used because Clarion changes the value of certain key presses (including the standard ASCII codes, 0 - 255). For instance, Clarion re-maps the following keys from their standard ASCII value to a value meaningful only to Clarion: Key Clarion Actual Escape 256 27 Enter 257 13 Backspace 258 8 If you use the Clarion keyboard functions and a user presses the backspace key, Clarion returns a code of 258. If you send this key code to the remote computer, what you will actually be sending is the code 2 (Clarion's keyboard functions return a LONG and Communications Ports can only accept a BYTE, therefore the high bytes of the return value are truncated and only the lower byte is sent). The remote computer will either display the character (a happy face) or act upon it (to the remote computer, it is a Ctrl-B). The remote computer will not know that you were trying to backspace over a previously typed character! Any character typed at the keyboard is a valid character to send out the Communications Port if that character has a value of 255 or less. It shouldn't be re-mapped or translated in any manner. GetKeyc returns keyboard characters "as is". It makes no translations on regular ASCII characters (0 - 255). Any code above 255 (an Extended Keyboard code) returns the actual keyboard scan code for that key with the value 256 added. By adding 256 to the value you can easily determine if the key is an extended key. A Backspace is code 8. An Enter is code 13. An Escape is code 27. Because Clarion includes its Keyboard Equate file in your application, there are no supplied mnemonics for the key codes that GetKeyc returns. Appendix A shows the actual key typed and Page 12 GAP Communications CLACOM the value returned by GetKeyc. You can not use BSKey to see if a key press is the Back Space key because of the keyboard re- mapping equates that Clarion includes in your program. If you do, you will be testing against the code 258 when you need to be testing against the code 8. For instance, this will not work: keychr BYTE retchr SHORT retchr = GetKeyc() ! Get Key Press if retchr = BSKey ! Backspace hit keychr = retchr ! Strip high Byte ComPutc(0,keychr) ! Actually sends a Ctrl-B end This will work: keychr BYTE retchr SHORT retchr = GetKeyc() ! Get Key Press if retchr = 8 ! Backspace hit keychr = retchr ! Strip high Byte ComPutc(0,keychr) ! Sends an 8 (backspace) end Page 13 GAP Communications CLACOM Port Initialization The first thing a communications program normally does is initialize the communications port and reset the modem. You will notice that the sample program, GTERM, takes a different approach to the usual "terminal" interface in that it doesn't initialize the port until it is ready to use it. How you initialize the communications port depends upon which Interface the user has selected. The DigiBoard and Int14/EBIOS Interfaces set up the port in a single step process. This is because some of the low level routines either in the Int14 Device Driver or the on-board BIOS require that all parameters be known when initializing a port on the board. Setting up the Standard Interface is a two step process. The first step is to set up the Interrupt Handler, program the UART to generate interrupts, turn the FIFO buffers on (if the UART is _ a 16550) and program the Interrupt Controller chip so that it will recognize the UART interrupts. The second step is to set the Line Control register in the UART. This is more commonly known as setting the Baud Rate, Party, Data, and Stop bits. Port Numbers for the Standard and DigiBoard Direct Interfaces are 0 based. Your users will not be accustomed to entering 0 for COM 1 or 1 for COM 2, therefore your application should use 1 when referring to COM 1, 2 when referring to COM 2, 3 when referring to COM 3, etc., and you should make the translations to 0 based ports before calling any of the Communications routines. Note that the INT14/EBIOS Interface uses port numbers that begin with 1. The following is an example on setting up the communications port. The first step is to initialize the ANSI driver. This is important so that the screen output functions know how large your Terminal Screen is and the default color you want to use. Page 14 GAP Communications CLACOM NOTE: It is imperative that you call InitAnsi prior to using any CLACOM function, particularly Gputc, Gputs, or any of the File Transfer routines. The need for this is particularly important if you are generating a Protected Mode application because the screen output functions write directly to video memory. In order to directly address video memory, these functions need to know the video segment address. The default for this address is B800 or A000. In Protected Mode, these addresses are not valid. One of the reasons for calling InitAnsi is so that it may determine the correct segment address to use when accessing video memory. If you forget to call InitAnsi, your program will crash as soon as a character is written to the display. You must pass the COM port number that the ANSI driver will be associated with. The ANSI Cursor Position Report (CPR) sequence is issued whenever the driver receives a Device Status Report (DSR) command. The CPR sequence is sent out the COM port. Since there is only one screen and one ANSI driver, the driver must know which port to use. The DSR/CPR sequences are generally only used by BBS programs to determine if the caller has ANSI capability. The second step is to determine which Interface the user is using and configure the port accordingly: InitAnsi(comport,MaxRows,MaxCols,14) ! Initialize ANSI Driver BaudRate = DEFORMAT(GCN:BaudRate) ! string to number data = deformat(GCN:Data) ! get Data stop = deformat(GCN:Stop) ! Stop if GCN:Parity = 'Odd' ! and Parity parity = 1 elsif GCN:Parity = 'Even' parity = 2 else parity = 0 end Page 15 GAP Communications CLACOM gotdigi = 0 ! assume no DigiBoard if clip(GCN:Interface) = 'DigiBoard' ! using DigiBoard comport = GCN:DigiChnl - 1 ! 0 base the Port # gotdigi = 1 ! set DigiBoard flag anystring = GCN:DigiSeg ! get Memory Window digiseg = StrHex(anystring) ! as a Hex Number anystring = GCN:DigiPort ! get I/O Port digiport = StrHex(anystring) ! as a Hex Number retcode = DsetUp(DigiSeg,DigiPort,comport,BaudRate,parity,data,stop) if retcode > 0 ! display error message and quit end elsif clip(GCN:Interface) = 'Int14/EBIOS' ! Int14/EBIOS comport = GCN:DigiChnl ! Port Number gotdigi = 1 ! set DigiBoard flag retcode = Int14Set(comport,BaudRate,parity,data,stop) if retcode > 0 ! display error message and quit end else ! Regular Interface ! get Port, IRQ, and BASE Address IRQ = 0 base = 0 if GCN:Port = 'COM1' comport = 0 elsif GCN:Port = 'COM2' comport = 1 elsif GCN:Port = 'COM3' comport = 2 IRQ = GCN:IRQ3 anystring = GCN:BASE3 base = StrHex(anystring) elsif GCN:Port = 'COM4' comport = 3 IRQ = GCN:IRQ4 anystring = GCN:BASE4 base = StrHex(anystring) end Page 16 GAP Communications CLACOM ! initialize COM Port and Interrupt Vector retcode = SetPort(IRQ,base,comport) if retcode > 0 ! display error message and quit else ! Set Baud, Parity, Data, and Stop retcode = InitPort(comport,BaudRate,parity,data,stop) if retcode > 0 ResetPort() ! Interrupts Off ! display error message and quit end end end As you can see when using the Standard Interface and there are no errors setting up the Port, we then call InitPort to set the Baud Rate, Data, etc. Page 17 GAP Communications CLACOM Input & Output To gather input from the local keyboard, GetKeyc is used. GetKeyc returns a SHORT. If the return value is less than 0 then that means no key was pressed (GetKeyc actually returns a -1 in this case). If the return value is greater than 255 then that means an extended key was pressed (function key, cursor pad key, etc). You normally do not send these extended keys out the communications port unless the remote end can accept and handle extended keys. If the remote end can handle extended keys, the usual procedure for sending these keys is to first send a 0, then send the lower 8 bits of the return value. If the return value is less than or equal to 255, then you assign the return value to a BYTE and call ComPutc to send the keyboard code. The following example shows how to use GetKeyc and interpret the return value. Note that we do not use the Clarion Key Code Equate labels since they are mapped to different codes: comport SHORT retchr SHORT keychr BYTE retchr = GetKeyc() ! get a keyboard char if retchr NOT= -1 ! if something there if retchr > 255 ! Extended Key case retchr ! which one of 278 ! Alt-U, Upload a File of 288 ! Alt-D, Download a File of 369 ! Alt-F10, activate Menu end else ! regular keyboard key keychr = retchr ! Translate to BYTE value ComPutc(comport,keychr) ! and send it out end end Page 18 GAP Communications CLACOM The following example is similar to the above but in this case, the remote end can handle extended keyboard codes (commonly called DoorWay mode): comport SHORT retchr SHORT keychr BYTE retchr = GetKeyc() ! get a keyboard char if retchr NOT= -1 ! if something there if retchr > 255 ! Extended Key case retchr ! which one of 278 ! Alt-U, Upload a File of 288 ! Alt-D, Download a File of 369 ! Alt-F10, activate Menu else ! nothing we care about keychr = retchr ! Translate to BYTE value ComPutc(comport,0) ! flag it as extended key ComPutc(comport,keychr) ! send scan code end else ! regular keyboard key keychr = retchr ! Translate to BYTE value ComPutc(comport,keychr) ! and send it out end end Whether or not local keyboard characters are sent to the local screen depends upon if you originated the connection or answered the connection. Generally the originating side does not display keyboard characters. It simply sends the characters out the communications port and the answering side displays the characters on its screen and sends the characters back, at which time you retrieve them from your receive buffer and display them. This is sometimes refered to as Full Duplex. Some answering systems do not echo characters back to the sender (refered to as Half Duplex). In this case, you will need to display the keyboard character in addition to sending it to the communications port. If you are writing BBS software, you always display locally typed characters on the screen, and you always echo characters received from the communications port back out the port. If you are writing Terminal Emulation software, whether or not to display locally typed characters on the screen is generally a Phone Book Page 19 GAP Communications CLACOM option for each entry in the phone book. Characters received from the communications port are never sent back out the port. The following is an example of keyboard input routines where "Half Duplex" operation is required: comport SHORT retchr SHORT keychr BYTE halfdup BYTE halfdup = 1 ! flag to use half duplex retchr = GetKeyc() ! get a keyboard char if retchr NOT= -1 ! if something there if retchr < 256 ! regular character keychr = retchr ! Translate to BYTE value ComPutc(comport,keychr) ! and send it out if halfdup ! if half duplex Gputc(keychr) ! display on local screen end end end A good example of Half Duplex versus Full Duplex is when you enter into Terminal Emulation mode when not connected with a remote computer. If the modem is configured to not echo characters back, then anything you type will not be displayed on the screen. This is because there is no On Line service on the remote end to send the characters back. If you subsequently place an item on the Terminal Menu to toggle duplex from full to half and toggle it to half, then what you type will be displayed on the screen (providing you write the code to handle this situation, as in the above example). GPutc and GPuts are the local output routines. The first displays _ single characters while the second displays entire strings. Both routines are tied into the internal ANSI driver which means they _ can contain ANSI display sequences to move the cursor, change colors, clear the screen, etc. ComGetc is the communications port input routine. It retrieves single byte values from the port. In order to distinguish between a no character available condition (empty receive buffer) and a legitimate character, it returns a negative value (-1) if there Page 20 GAP Communications CLACOM are no characters waiting to be read. The return value must be assigned to a BYTE before it can be displayed by Gputc. An example of ComGetc and Gputc together: comport SHORT retchr SHORT keychr BYTE retchr = ComGetc(comport) ! get a remote char if retchr NOT= -1 ! if something there keychr = retchr ! Translate to BYTE value Gputc(keychr) ! and display it end ComPutc and ComPuts are the communications output routines. The __ first sends single characters while the second sends entire strings. A word about the built in ANSI driver and Clarion. The ANSI driver writes directly to the video display memory (taking care to honor DESQView's shadow buffer if operating under DESQView). Because Clarion keeps a backup copy of the video display, Clarion will overwrite anything placed on the screen by Gputc and Gputs. This occurs because when Clarion opens a screen or a menu, it first updates the physical screen with the contents of its backup buffer, then opens the screen. The only time this is a problem is when you are in Terminal Mode and using the CLACOM output routines. To circumvent this problem there is a procedure called GetScrn which will update Clarion's backup buffer with the contents of the physical screen. This procedure should be called prior to invoking a Clarion function that writes to the screen. Page 21 GAP Communications CLACOM File Transfers CLACOM supports all of the popular File Transfer Protocols. Each of the protocols are given a number (with the exception of Zmodem). Before initiating an Upload or a Download, you need to prompt the user for a Protocol. Your end users won't be the least bit impressed about having to type in a number so your Protocol Browse Box should display Protocol Names. In the background, you will translate the Names into numbers to send to the protocol drivers. The sample Terminal Program shows an excellent example of how to prompt for a Protocol and translate the string into a number to send to the protocol drivers. The Protocols are numbered as follows: 0 - ASCII 3 - 1K Xmodem-G 1 - Xmodem 4 - Ymodem 2 - 1K Xmodem 5 - Ymodem-G Note that as far as CLACOM is concerned, there is no difference between Checksum Xmodem and CRC Xmodem. CLACOM always starts in "CRC Mode" but will adjust itself as necessary. Also note that both of the Ymodem protocols (as well as Zmodem) are Batch Protocols and when Downloading, you need not prompt for a File Name since the name will be supplied by the sender. When Uploading you can either provide a single File Name to upload or a Wild Card specification. To Download (receive) files using the above protocols, you call the DownLoad function. The equivalent Zmodem function is called GetZmodem. To Upload (send) files using the above protocols, you call the UpLoad function. The equivalent Zmodem function is called SendZmodem or SendZmodem1. When transferring files you have two options when displaying the transfer statistics (i.e., the CPS rating, bytes transferred, progress meter, etc.). You can use the built in Transfer Statistics Window or display your own window. The built in window may not be suitable for some applications. For instance, you may not like its colors or its screen position. To use your own Transfer Statistics Window, simply pass the value of 1 in the statfunc parameter when calling the Upload or Download functions. Page 22 GAP Communications CLACOM When using your own window, the file transfer statistics will be displayed according to how you design the screen. You may display some or all of the statistics. Because Clarion does not have a pointer data type, the transfer functions cannot call your procedure so that you may keep track of your own statistics. Instead, all they can do is update your transfer window. This means that your screen structure will need to be designed so that it uses the variables that the transfer functions use to keep track of the statistics. These variables are all of the CSTRING data type and are usable by your Clarion application simply by declaring a GROUP structure over the first variable. To utilize these variables in your screen structure, declare a GROUP structure as follows: TransferVars GROUP, PRE(XFR), EXTERNAL, NAME('xfervars') FileName CSTRING(128) ! File Name FileSize CSTRING(14) ! Size of File Blocks CSTRING(8) ! # of Blocks in File Bytes CSTRING(10) ! # of Bytes in File Errors CSTRING(8) ! Current errors CPS CSTRING(10) ! Current CPS Rating StatusMes CSTRING(26) ! Current Status Message Protocol CSTRING(14) ! Current Protocol StatMeter CSTRING(34) ! Progress Meter End Page 23 GAP Communications CLACOM You will probably have to code the screen structure by hand since Clarion does not allow you to select global variables for use in screen fields. You can use the screen structure in the sample application as a template for your own screens. To reference the transfer statistics variables, you declare an ENTRY field with the SKIP attribute using one of the above variable names: XFERSCREEN SCREEN(12,60),PRE(XSC),CENTER,SHADOW,COLOR(30) ROW(2,4) STRING('File Name :') .......... ROW(5,7) STRING('Blocks :') .......... ROW(8,7) STRING('Status :') ROW(2,16) ENTRY(@S14),USE(XFR:FileName),SKIP,COLOR(63,78,120) ROW(5,16) ENTRY(@S8),USE(XFR:Blocks),SKIP,COLOR(63,78,120) ROW(8,16) ENTRY(@S26),USE(XFR:StatusMes),SKIP,COLOR(63,78,120) End. Prior to calling an Upload or Download function you should open your transfer screen. When the file transfer is completed, you should then close your screen. The transfer routines will update your screen after each block of data is sent or received (this is the equivalent to you calling the Clarion Display procedure). Note that when using your own transfer window, if there is a critical error such as the inability to open the file, no error message will be displayed. You should check the return code from the transfer functions and display your own error message if necessary. When Downloading (receiving) files, the files will be placed into the current working directory. If you want the files to be placed into a specific directory, you should change into that directory prior to calling a Download function. When Uploading (sending) files, the files are expected to be in the current working directory. You need to change into whatever directory the files are located in. One exception to this is Zmodem where there is an alternate Send function that allows you to pass the directory path as one of the parameters (please see SendZmodem1 in the Reference Section for more information about this function). Page 24 GAP Communications CLACOM Capture Buffers CLACOM supports automatic Scroll Back or Capture Buffers. When enabled, any data (with the exception of ANSI sequences) that is sent to the ANSI driver using Gputs or Gputc is also placed in the capture buffer. The capture buffer is capable of holding 64k of data and is automatically written to disk when it becomes full. After a disk write, the buffer is reset so that another 64k of data can be stored. Two functions are provided to support capturing of data. SetCaptureFile tells the capture routines what name to give the capture file. It should be called first. If you do not call this procedure then a default name will be used for the capture file. SetCapture is used to turn the capture buffer on or off. You must always be sure to call SetCapture with a parameter of 0 to turn the capture buffer off when you are finished with the capture file. Failure to do so will leave the buffer memory allocated and will prevent flushing the capture data to disk (whatever is in the buffer will be lost). CLACOM is responsible for capturing and saving the data. What you do with the data is up to your application. If you would like for your users to be able to view the data, you will need to provide Clarion routines for doing so. If you do provide a View procedure to allow your users to view the capture data, be sure to first call SetCapture with a parameter of 0 to flush the capture buffer to disk. When you regain control from the View procedure, you will once again need to call SetCapture with a parameter 1 to turn the capture buffer back on. Page 25 GAP Communications CLACOM The following is an example of using a capture buffer: ScrFile CSTRING(64) ! Name of ScrollBack File ! set up an automatic Scroll Back Buffer ScrFile = 'GTERM$$.CAP' ! Give Scroll File a name Do TurnOnCapture ! Turn on Capture ..... ! your program code here ! end of procedure, close Scroll Back Buffer retchr = SetCapture(0) ! Turn Capture Off Return ! Return from Procedure TurnOnCapture Routine ! Turn on Capture SetCaptureFile(ScrFile) ! Tell Capture File Name if SetCapture(1) ! and turn on Capture Open(CaptureErr) ! couldn't allocate Mem bell() ! make noise Accept ! tell um Close(CaptureErr) ! close error screen end Exit ! Return from Routine GTERM gives an excellent example of how to utilize an automatic Scroll Back buffer and allow the user to specify a Capture Buffer. It also shows how to allow the user to view the contents of the Scroll Back or the Capture Buffer, clear the buffer, and save it under a different name. Page 26 GAP Communications CLACOM Sample Application Included with CLACOM is a sample Terminal Emulation program (called GTERM) which shows how to use most of the communications routines. You may use this application as a template for designing your own communications program. GTERMG is a GUI version of the same program (it requires the Clarion GUI kit). The First Procedure is defined as InitProgram. InitProgram first arms a ShutDown Procedure called ResetCbreak. In then makes a call to SetCbreak to set up the Ctrl-Break handler (a necessary requirement for any communications program). ResetCbreak will be called automatically when the program ends. It makes a call to RestCbreak to restore the Ctrl-Break handler. InitProgram then checks to see if the Main Configuration File exists. If this is the first time the program is run, it will create the configuration file with default values for each of the fields. It then checks to see if the Protocol File exists. If __ not, it creates the file with the 7 internal protocols. This data could be set up in a Memory Queue, but placing it in a file allows you to create an entry screen so that your users can add external protocols. You will see from examining the File Properties that the fields to allow for external protocols are already in the file. If you do create a Browse/Form for adding external protocols, you need to make sure that the user can not delete or change any of the internal protocols. InitProgram then calls MainMenu. On MainMenu the user may select the Files Menu, which contains Quit, to exit the program. The Dial Menu brings up a Lookup screen where the user may select a Phone Number to call. The Dialing Directory is tied into the EditPhone Form so that a user may add or change an entry without having to go to the Setup Menu. When a phone number has been selected, the Dial Procedure initializes the Communications Port and calls the number. Upon successful connection with the remote computer it will place the user in Terminal Mode. Dial gives excellent examples on interfacing with a communications port and a modem. The Terminal Menu puts the user directly into Terminal Mode. Because Terminal Mode can be entered either directly or from the Dial Menu, the procedure checks to see if it was called by Dial. If so, it won't attempt to initialize the Communications Port. If entered from the Menu, Terminal initializes the port in exactly Page 27 GAP Communications CLACOM the same manner as Dial, with one exception. For the Port parameters, instead of using the parameters from a dialing directory entry, it uses the global default parameters. Terminal Mode is really the heart of the application. Whatever is received from the Communications Port is displayed on the screen. Incoming characters are sent to the ANSI Driver. If you wish to _ emulate a TTY device, instead of sending the characters to the ANSI Driver, you can use Clarion's TYPE function (the character will first have to be converted to a string). Keyboard codes (those entered from the local keyboard) are checked to see if they are extended keys. Any keyboard code above 255 is an extended key. If the key code is a regular keyboard character, it is sent out the Communications Port. If the key code is an extended key it is checked to see if it is the menu activation key (Alt-F10) or one of the "hot keys". If so, the routines associated with those keys are invoked. If the key code is not a regular ASCII character or an extended key that Terminal recognizes it is simply discarded. Please see the section Key Codes for more information on Extended Keyboard Codes and why you need to use CLACOM's GetKeyc function to retrieve characters from the keyboard. Terminal includes a Menu that is activated by pressing the Alt- F10 key. It allows the user to exit Terminal Mode, Upload and Download Files, Clear the Screen, Change Modem Parameters and Hang Up the modem (drop carrier). You will notice that any menu function that depends upon there being a remote carrier is disabled if there is no connection with a remote computer. Because Clarion writes to the screen twice (once to video memory and once to its own backup buffer) Clarion doesn't know that you've been using the ANSI driver to display characters. When you _ use Gputc and Gputs to send incoming characters to the CLACOM ANSI driver, Clarion has no idea that you've been writing to the screen. While in Terminal Mode, before you call any Clarion Function that displays something on the screen (with the possible exception of the TYPE function) you need to update the backup _ buffer that Clarion writes to. This is accomplished with a call to GetScrn. GetScrn reads the contents of the physical screen and updates Clarion's backup buffer with the information. Terminal shows how and when to call GetScrn. If you don't make the call to GetScrn then Clarion will erase whatever is on your Terminal Screen before it displays the screen you open. To get a better understanding for this, comment out all of the calls to GetScrn in the Terminal Procedure. Then make and run the program. Make a connection to a remote computer. While in Terminal Mode, activate Page 28 GAP Communications CLACOM the Menu (Alt-F10). Watch what is on the screen suddenly disappear! The Setup Menu allows a user to set default Modem Parameters and enter Phone Book entries. The Modem Parameters are used as the defaults for each Phone Book entry and when entering Terminal Mode from the Terminal Menu. GTERM gives excellent examples on how to use the CLACOM functions and procedures. It can be used as a template to write powerful Terminal Emulation programs that include more terminal emulations, external protocols, script files (for automating __ logons), keyboard macros, Compuserve or BBS Message handling, Screen Capturing, and lots more. GTERM can be condensed so that your Mailing List Application can automatically dial a number contained in the data base. It can be expanded to become a popular Term program, even a BBS program! Page 29 GAP Communications CLACOM Global Variables The following variables are declared global and may be used by your application to alter the behavior of the Communications routines. The names shown are the actual names used by the Communications routines. See the sample application to see how they are declared and named: asciidel The number of clock tics to delay after sending each line in a file when using the ASCII file transfer. 18 tics equals 1 second. combufsiz Sets the size of the Receive Buffer when using the Direct Interface. The Receive Buffer defaults to 6144 bytes. This has proven to be the optimal size for high speed communications when using a file transfer protocol such as Ymodem-G. However you may increase or decrease this size by changing this variable (decreasing the size will typically result in lost data at high speeds). crscur Contains the ANSI driver's current Cursor Position. The high byte contains the row coordinates and the low byte contains the column coordinates. Changing this variable changes the cursor position. gnormal Contains the ANSI driver's current Color. This is the initial color that you pass to InitAnsi but it will change whenever an ANSI color sequence is sent to Gputs or Gputc. Changing this variable changes the color of subsequent characters sent to the ANSI driver. meterchr This variable defines the character that makes up the Progress Meter on the File Transfer Status Window. noascmes When set to 1, disables all messages and windows associated with ASCII file transfers. This is useful when you are using the ASCII upload/download routines for something other than transferring files. nocts When set to 1, disables the Clear To Send (CTS) checking that is performed by the Communications Output routines. Should never be set unless there is a specific reason for doing so. usefifo If a Communications Port has a 16550 UART installed, the FIFO buffers on the UART will automatically be turned on and utilized. Some UART chips have defective FIFO implementations where turning on the FIFO buffers will cause incorrect behavior. To disable the FIFO buffers, set this flag to 0. Page 30 GAP Communications CLACOM Functions - Quick Reference CkeyPress - Checks for a remote or local key press. ClrBuf - Clear the communications receive buffer. ComGetc - Gets a character from com port. ComGetd - Gets a character from com port with time-out. ComGets - Gets a string of characters up to deliminator. ComPutb - Sends a buffer of data to com port. ComPutc - Sends a character to com port. ComPuts - Sends a string to com port. CursorOff - Turns local cursor off. CursorOn - Turns local cursor on. DclrTx - Clear DigiBoard Transmit buffer. DgtTxfree - Get Free space in DigiBoard Transmit buffer. Dmodem - Change DigiBoard Port parameters. DownLoad - Download using Xmodem and Ymodem. Drestore - Reset DigiBoard Port. DsetUp - Initialize DigiBoard Port (Direct Interface). Dtr - Toggles the DTR line on or off. GetCRC16 - Returns a 16 bit CRC value. GetCRC32 - Returns a 32 bit CRC value. GetKeyc - Gets keyboard character and scan code. GetScrn - Update Clarion's screen buffer. GetZmodem - Download using Zmodem. Gputc - Sends a character to local screen. Gputs - Sends a string to local screen. InitAnsi - Initializes ANSI driver. InitPort - Sets up Communications Port (Std Interface). Int14Set - Initialize DigiBoard (Int14/EBIOS Interface). Iscd - Checks if there is a Carrier. LineStat - Get UART Line Status. ModemPuts - Send a string to the modem. ModemStat - Get Modem Status. PeekChr - Check if character is in Receive Buffer. PosCursor - Update ANSI Driver Cursor Position. RecvCount - Returns # of characters in Receive Buffer. ResetPort - Restores Communications Port (Std Interface). RestCbreak - Restores Ctrl-Break vector. Rts - Toggles RTS line on or off. Rxempty - Checks if any characters in receive buffer. SendBreak - Send a break signal to the modem. SendZmodem - Send files using Zmodem. SendZmodem1 - Send files using Zmodem (alternate function). SetCapture - Turns Capture Buffer On or Off. SetCaptureFile - Sets the name of Capture File. SetPort - Initializes Communications port. SetCbreak - Initializes Ctrl-Break vector. Page 31 GAP Communications CLACOM StrHex - Translate Hex String to number. StrWord - Find substring in string. Timer - Time Delay. UpLoad - Send files using Xmodem and Ymodem. Page 32 GAP Communications CLACOM Functions - Detailed Reference Functions return a value, procedures do not return anything. Procedures cannot be used in assignment statements. They perform a service and do not report back as to the successful completion of that service. Functions also perform a service but they do report back on how well that service was performed. The return value from a function must be assigned to a variable of like type or used in a comparison statement (this is due to Clarion's strong type checking which will not allow you to call a function without checking its return value). The function descriptions will note whether or not a function is actually a Procedure (does not return a value) or a Function (does return a value). The Examples will use a string called cstr to let you know that _ the function requires a string in the C, NULL terminated, format (CSTRING in Clarion). Passing Clarion Strings to these functions will not work. You will need to assign the Clarion STRING to a CSTRING and then pass the variable in the function call. Page 33 GAP Communications CLACOM CkeyPress ----------------------------------------------------------------- Purpose Checks for a remote or local key press. CkeyPress(port) SHORT port COM Port Number Type Function - Returns SHORT Description This function will check the local keyboard as well as the communications receive buffer to see if a key is waiting to be read. It is most often used in loops that need to wait for a key press, either from remote or local. Return Value 0 = no key is waiting, 1 = a key is waiting. Example c = CkeyPress(0) ! key pressed? loop while CkeyPress(0) = 0 ! do nothing end ! until a key is pressed Page 34 GAP Communications CLACOM ClrBuf ----------------------------------------------------------------- Purpose Clears the Communications receive buffer. ClrBuf(port) SHORT port COM Port Number Type Procedure Description Empties the receive buffer such that any pending characters are simply ignored. Return Value None. Example ClrBuf(0) ! clear recv buf (COM 1) Page 35 GAP Communications CLACOM ComGetb ----------------------------------------------------------------- Purpose Retrieves all the characters in the Receive Buffer. ComGetb(port, str) SHORT port COM Port Number CSTRING str String to store characters in Type Function - Returns SHORT Description Retrieves all of the characters in the Receive Buffer and stores them in the passed string. If a 0 is returned, it means the Reveive Buffer was empty. In this case, a NULL string will be returned. The string passed to this function must be of sufficient length to hold all of the characters. It is very easy to overwrite code or data with this function if the passed string parameter is not large enough to hold all of the data. Return Value 0 or the number of characters stored in the passed string. Example port SHORT numbytes SHORT cstr CSTRING(255) port = 0 ! use COM 1 numbytes = ComGetb(port,cstr) ! get the string Page 36 GAP Communications CLACOM ComGetc ----------------------------------------------------------------- Purpose Retrieve a character from communications buffer. ComGetc(port) SHORT port COM Port Number Type Function - Returns SHORT Description Checks the communications receive buffer and returns the next character, if any. In order to distinguish between a legitimate character and a "no character" condition, this function returns a SHORT even though a legitimate character is a BYTE. If the function does not return a -1, the return value needs to be assigned to a variable of type BYTE if the character is to be passed to a function that requires a BYTE parameter (Gputc and ComPutc, for instance). Return Value Next character in buffer or -1 for no characters waiting. Example c = ComGetc(0) ! get a character keychr BYTE retchr SHORT comport SHORT comport = 0 ! use COM 1 retchr = ComGetc(comport) ! get a character if retchr NOT= -1 ! anything there? keychr = retchr ! yes, truncate high byte Gputc(keychr) ! and display end Page 37 GAP Communications CLACOM ComGetd ----------------------------------------------------------------- Purpose Retrieve a character from communications buffer with delay. ComGetd(port, secs) SHORT port COM Port Number SHORT secs Number of seconds to wait Type Function - Returns SHORT Description This function is the same as ComGetc, except that if there are no characters in the receive buffer, it will wait for the number of seconds you specify. Return Value Next character in buffer or -10 for time-out (no characters to read). Example comport SHORT comport = 0 ! use COM 1 do while ComGetd(comport,2) = -10 ! wait 2 seconds end ! for a character Page 38 GAP Communications CLACOM ComGets ----------------------------------------------------------------- Purpose Gets a string of characters up to terminator. ComGets(port, str, chr) SHORT port COM Port Number CSTRING str String to store characters in BYTE chr Character to look for Type Function - Returns SHORT Description Retrieves a string of characters up to, but not including, the terminating character. The characters are stored in the string that you pass as a parameter. Characters are stored until the terminator is encountered. If a 0 is returned, it means the terminator was the first character in the Receive Buffer. In this case, a NULL string will be returned. This function does not time out. It will not return until it encounters the terminator. Unless you know for a fact that the terminating character is in the Receive Buffer, you should call PeekChr first to make certain that the terminating character is in the buffer. The string passed to this function must be of sufficient length to hold all of the characters that are stored while looking for the terminator. It is very easy to overwrite code or data with this function if the passed string parameter is not large enough to hold all of the data. Return Value 0 or the number of characters stored in the passed string. Page 39 GAP Communications CLACOM Example port SHORT numbytes SHORT cstr CSTRING(255) port = 0 ! use COM 1 if PeekChr(port,10) ! check for Line Feed numbytes = ComGets(port,cstr,10) ! get the string end Page 40 GAP Communications CLACOM ComPutb ----------------------------------------------------------------- Purpose Sends a buffer of data out the communications port. ComPutb(port, buffer, len) SHORT port COM Port Number CSTRING buffer Buffer containing data to send SHORT len Number of bytes to send Type Procedure Description This function will send a user supplied buffer of len bytes out the communications port, one byte at a time. Return Value None. Example buffer CSTRING(200) ComPutb(0,buffer,100) ! Send 100 bytes to COM 1 Page 41 GAP Communications CLACOM ComPutc ----------------------------------------------------------------- Purpose Sends a single character out the communications port. ComPutc(port, ch) SHORT port COM Port Number BYTE ch Character to send Type Procedure Description Will send a single character out the communications port. Return Value None. Example ComPutc(0,13) ! Send a Carriage Return keychr BYTE retchr SHORT comport SHORT comport = 0 ! use COM 1 retchr = GetKeyc ! Keyboard hit? if retchr NOT= -1 ! anything there? if retchr < 256 ! yes, if regular char keychr = retchr ! strip high byte ComPutc(comport,keychr) ! and send it to remote end end Page 42 GAP Communications CLACOM ComPuts ----------------------------------------------------------------- Purpose Sends a string of characters out the communications port. ComPuts(port, str) SHORT port COM Port Number CSTRING str String to send Type Procedure Description Will send a string of characters out the communications port. Note that unlike ComPutb, the number of bytes to send is determined by the length of the string. Therefore this function stops sending characters when it encounters the NULL byte. Return Value None. Example comport SHORT cstr CSTRING(100) comport = 0 ! use COM 1 cstr = 'Send this String' ! string to send ComPuts(comport,cstr) ! send string to com port Page 43 GAP Communications CLACOM CursorOff ----------------------------------------------------------------- Purpose Turns the local cursor off. CursorOff() Type Procedure Description This function is used to turn the cursor on the local monitor off. Return Value None. Example CursorOff() ! turn the cursor off CursorOn ----------------------------------------------------------------- Purpose Turns the local cursor on. CursorOn() Type Procedure Description This function is used to turn the cursor on the local monitor on. Return Value None. Example CursorOn() ! turn the cursor on Page 44 GAP Communications CLACOM DclrTx ----------------------------------------------------------------- Purpose Clears the Transmit Buffer on DigiBoard. DclrTx(port) SHORT port COM Port (Channel) Number Type Procedure Description When using a DigiBoard (Interface is set to DigiBoard or Int14/EBIOS), this function will clear the Transmit Buffer for the specified port on the DigiBoard. Return Value None. Example DclrTx(4) ! clear xmit buffer Page 45 GAP Communications CLACOM DgtTxfree ----------------------------------------------------------------- Purpose Returns number of Free Bytes in Digi Transmit Buffer. DgtTxfree(port) SHORT port COM Port (Channel) Number Type Function - Returns USHORT Description When using a DigiBoard (Interface is set to DigiBoard or Int14/EBIOS), this function returns the number of free bytes in the Transmit Buffer for the specified port on the DigiBoard. Return Value None. Example freebytes USHORT freebytes = DgtTxfree(4) ! get free space Page 46 GAP Communications CLACOM Dmodem ----------------------------------------------------------------- Purpose Initialize Digi port to baud, parity, data, and stop bits Dmodem(port, baud, parity, data, stop) SHORT port COM Port (Channel) Number LONG baud BPS rate SHORT parity 0 = None, 1 = Odd, 2 = Even SHORT data 6, 7, or 8 data bits SHORT stop 1 or 2 stop bits Type Procedure Description Changes the current port settings on a DigiBoard to the parity, data bits, stop bits, and baud rate. The port parameters are normally set when first initializing the DigiBoard port. This function allows you to change those parameters while "on- line". Return Value None. Example Dmodem(4,2400,2,7,1) ! E, 7, 1 - 2400 bps Page 47 GAP Communications CLACOM DownLoad ----------------------------------------------------------------- Purpose Receives one or more files. DownLoad(port, protocol, filename, statfunc) SHORT port COM Port Number SHORT protocol Number of protocol to use CSTRING filename Name of file to download SHORT statfunc 0 or 1 (see below) Type Function - Returns SHORT Description This function allows you to receive a file from a remote computer. The protocols are defined as follows: 0 = ASCII 3 = 1K Xmodem-G 1 = Xmodem 4 = Ymodem 2 = 1K Xmodem 5 = Ymodem-G Filename is a CSTRING containing the name of the file to download. If the protocol is a batch protocol (Ymodem or Ymodem-G) then you may pass a NULL string (cstr = '') since the name of the file will be supplied by the remote sender. If a filename is passed, it will be ignored. The statfunc parameter allows you to override the default Transfer Status Window. A value of 0 means the internal window will be displayed and updated. A value of 1 means you will open your own window and the transfer statistics will be displayed on it instead. Return Value 0 for successful transfer. If an error occurs, the following values are returned: 1 - Error opening file 6 - Error writing file 2 - Receiver cancelled 7 - CRC error (1K Xmodem-G 3 - Sender cancelled or Ymodem-G) 4 - Time out 8 - Too many errors 5 - No carrier 9 - Block error Page 48 GAP Communications CLACOM Example cstr CSTRING(100) cstr = 'FILE.ZIP' ! receive a single file DownLoad(0,2,cstr,0) ! using 1K Xmodem cstr = '' ! receive 1 or more files DownLoad(0,4,cstr,0) ! using Ymodem Page 49 GAP Communications CLACOM Drestore ----------------------------------------------------------------- Purpose Reset Modem attached to a DigiBoard Port. Drestore(port) SHORT port COM Port (Channel) Number Type Procedure Description This function simply turns off the handshaking lines to the modem. It turns DTR and RTS off and disables Hardware Flow control. Should be used only when using the DigiBoard or Int14/EBIOS Interface. Return Value None. Example Drestore(4) ! Reset Modem Page 50 GAP Communications CLACOM DsetUp ----------------------------------------------------------------- Purpose Initialize Digi port to baud, parity, data, and stop bits. DsetUp(base, port, channel, baud, parity, data, stop) USHORT base Memory Window USHORT port I/O Port SHORT channel Channel Number (port) LONG baud BPS rate SHORT parity 0 = None, 1 = Odd, 2 = Even SHORT data 6, 7, or 8 data bits SHORT stop 1 or 2 stop bits Type Function - Returns SHORT Description When using a Communications Interface set to DigiBoard, this function initializes the specified port (Channel) on the DigiBoard. The DigiBoard Interface is a direct link to the DigiBoard (a Device Driver is not needed). In order to use this interface, the end user must have already run the DigiBoard Reset program called RESETDIG.EXE. The base address is the high memory address the DigiBoard uses when communicating with the host computer. Valid base addresses are: C000 D000 C800 D800 The port is the I/O port the DigiBoard is attached to. Valid ports are: 100 220 110 300 120 320 200 Page 51 GAP Communications CLACOM The channel is the Communications Port to use on _ the DigiBoard. When using the Direct Interface, Channel Numbers are 0 based. Therefore, this parameter should be 0 - 15. Note that base and port are USHORTS. Because it is difficult to gather input from an end user such that the result is a valid hexadecimal number, these two fields are generally stored as strings. You can use the function StrHex to convert a __ Hexadecimal String to an unsigned short. Return Value 0 = Successful. 1 = DigiBoard not Installed or RESETDIG.EXE not run. 2 = DigiBoard not Responding. 3 = Invalid Parameter passed. 4 = DigiBoard EPROM is too old. Example ! set up 1st port on DigiBoard (Channel = 1) ! DigiBoard Memory Address = D800 ! DigiBoard I/O Port = 320 digiseg USHORT digiport USHORT cstr CSTRING(12) cstr = 'D800' ! Base Address digiseg = StrHex(cstr) ! as a number cstr = '320' ! I/O Port digiport = StrHex(cstr) ! as a number if DsetUp(digiseg,digiport,0,38400,0,8,1) ShowError('Unable To Initialize DigiBoard') end Page 52 GAP Communications CLACOM Dtr ----------------------------------------------------------------- Purpose Toggle the DTR line on or off. Dtr(port, how) SHORT port COM Port Number SHORT how 0 = Turn DTR off 1 = Turn DTR on Type Procedure Description This routine is used to turn the DTR line of the communications port on or off. Turning DTR off while there is a carrier will cause the modem to drop carrier. In order to send commands to the modem, DTR needs to be on. Return Value None. Example cstr CSTRING(10) cstr = 'ATZ' & '<13>' ! Modem Init String Dtr(0,1) ! wake up modem ComPuts(0,cstr) ! reset the modem Page 53 GAP Communications CLACOM GetCRC16 ----------------------------------------------------------------- Purpose Returns a 16 bit CRC. GetCRC16(crc, value) SHORT crc Current CRC SHORT value Vaule to add to CRC Type Function - Returns SHORT Description This is an internal function used by the File Transfer routines to calculate the 16 bit CRC of a data block. To use, you first set the initial CRC value to 0. Then for each character (typically a data buffer) you pass the current CRC value and the character for which you wish to obtain a CRC from. Return Value 16 Bit CRC value. Example crc16 SHORT value SHORT crc16 = 0 ! Initialize crc16 = GetCRC16(crc16,value) ! get CRC Page 54 GAP Communications CLACOM GetCRC32 ----------------------------------------------------------------- Purpose Returns a 32 bit CRC. GetCRC32(value,crc) SHORT value Vaule to add to CRC LONG crc Current CRC Type Function - Returns LONG Description This is an internal function used by the Zmodem Transfer routines to calculate the 32 bit CRC of a data block. To use, you first set the initial CRC value to 0FFFFFFFF. Then for each character (typically a data buffer) you pass the current CRC value and the character for which you wish to obtain a CRC from. Return Value 32 Bit CRC value. Example crc32 LONG value SHORT crc32 = 0FFFFFFFFh ! Initialize crc32 = GetCRC32(value,crc32) ! get CRC Page 55 GAP Communications CLACOM GetKeyc ----------------------------------------------------------------- Purpose Gets keyboard character and scan code. GetKeyc() Type Function - Returns SHORT Description This is the main keyboard input routine. It returns the keyboard character or if the key struck was an extended key, it will return a unique code. These codes are described in Appendix A. This function should be used when designing terminal emulation software, BBS software or any software where you will be checking the local keyboard and the Com Port for key presses. Clarion's ASK and KEYCODE functions cannot be used since Clarion re-maps extended keys and some control keys. Any character in the ASCII range of 0 to 255 is a valid character and can be sent out the Com Port, however Clarion re-maps some of these characters and does not return their true byte value. If the return value is greater than 255, then the key that was pressed is an Extended Key (i.e., F1, Up-Arrow, PgUp, Home, etc). The Extended Key corresponds to the Keyboard Scan code with the value 256 added. Return Value ASCII code for the key pressed or a unique code for extended keys. Example retchr SHORT retchr = GetKeyc() ! get a keyboard char if retchr > 255 ! Extended Key case retchr ! which one of 278 ! Alt-U, Upload a File of 288 ! Alt-D, Download a File of 369 ! Alt-F10, activate Menu end end Page 56 GAP Communications CLACOM GetScrn ----------------------------------------------------------------- Purpose Copies Physical Screen to Clarion Screen Buffer. GetScrn() Type Procedure Description Clarion keeps a backup copy of the physical screen in a buffer. Whenever you send something to the screen by either opening a Window, a Menu, or what have you, Clarion performs two operations: it updates the physical screen and its screen buffer. The screen output routines in CLACOM (Gputc and Gputs) write directly to the physical screen memory. Clarion, therefore, doesn't know that the screen has been written to. When you open a Window or a Menu, Clarion will re-draw the screen with whatever happens to be in its Screen Buffer and then open your Window. What Clarion puts on the screen will not necessarily be what you see on your physical screen. Clarion only knows about what it wrote to the physical screen. It knows nothing about what an outside function might have put on the screen. If you are using the CLACOM routines to write to the screen and you need to open a Clarion Window, activate a Menu, or otherwise write to the local screen using a Clarion function, you need to call GetScrn before making your Clarion call. GetScrn will copy the contents of the Physical Screen to the Clarion Screen Buffer. This will prevent Clarion from overwriting the physical screen with data that no longer belongs there. Return Value None. Page 57 GAP Communications CLACOM Example keychr BYTE retchr SHORT retchr = GetKeyc() ! Keyboard hit? if retchr = -1 ! nothing there goto getrmt ! check remote end keychr = retchr ! strip high byte if set if retchr < 256 ! if not a scan code ComPutc(0,keychr) ! send to com port goto getrmt ! and check remote end ! Keyboard key was an Extended key. Check if special key ! First though, it is likely that we will be doing something ! that will use Clarion to write to the Screen (open Window, ! Menu, etc). If so, we have to read the physical screen and ! update Clarion's Screen Buffer. This is because Clarion ! doesn't know that our ANSI driver has been writing to the ! screen. If we don't do this, Clarion will erase whatever is ! on the screen. GetScrn() ! update Screen Buffer ! Note that we already know the key is an extended key so we ! are only checking the low byte of the key (same as ! subtracting 256 from the return value). case keychr ! get special keys of 22 ! Alt-U, Upload A File if online = 0 ! if no carrier,no upload Open(NotOnLine) ! Tell um can't upload bell() ! Make noise Beep(0,300) ! Wait 3 seconds Close(NotOnLine) ! Close Screen else ! otherwise, upload away UpFile end end Page 58 GAP Communications CLACOM GetZmodem ----------------------------------------------------------------- Purpose Receives 1 or more files using the Zmodem Protocol. GetZmodem(port, statfunc) SHORT port COM Port Number SHORT statfunc 0 or 1 (see below) Type Function - Returns SHORT Description This function allows you to receive one or more files using Zmodem. The files will be placed in whatever directory the program happens to be in at the time of the call. You may want to use SETPATH to change into a work directory prior to the call. The statfunc parameter allows you to override the default Transfer Status Window. A value of 0 means the internal window will be displayed and updated. A value of 1 means you will open your own window and the transfer statistics will be displayed on it instead. Return Value 0 for successful transfer. If an error occurs, the following values are returned: 1 - Error opening file 4 - Time out 2 - Receiver cancelled 5 - No carrier 3 - Sender cancelled 6 - Error writing file Example error = GetZmodem(0,0) ! Receive using Zmodem Page 59 GAP Communications CLACOM Gputc ----------------------------------------------------------------- Purpose Sends a single character to local screen. Gputc(ch) BYTE ch Character to send Type Procedure Description This is one of the main output routines. It is part of the ANSI driver. It will send a single character to the local screen. Return Value None. Example Gputc(12) ! Clear the Screen retchr SHORT keychr BYTE retchr = GetKeyc() ! Keyboard hit? if retchr NOT= -1 ! if something there keychr = retchr ! truncate high byte Gputc(keychr) ! and display it end Page 60 GAP Communications CLACOM Gputs ----------------------------------------------------------------- Purpose Sends a string of characters to local screen. Gputs(str) CSTRING str String to send Type Procedure Description This is one of the main output routines and is part of the ANSI driver. It will send a string of characters to the local screen. Return Value None. Example cstr CSTRING(100) cstr = 'This is a string of characters' Gputs(cstr) ! Display locally ComPuts(0,cstr) ! and to COM 1 ! this example embeds the CR/LF pair at the beginning ! and end of the string cstr = '<13,10>' & 'This is a string of characters' & '<13,10>' Gputs(cstr) ! Display locally Page 61 GAP Communications CLACOM InitAnsi ----------------------------------------------------------------- Purpose Initialize ANSI driver. InitAnsi(port, row, col, color) SHORT port COM Port Number BYTE row Number of Rows on Screen BYTE col Number of Columns on Screen BYTE color Default Color to use Type Procedure Description This function sets up the ANSI driver so that it knows the maximum number of Rows and Columns on the Screen and the default color to use when displaying characters. This function must be called prior to using the output routines Gputc and Gputs. Since __ __ the ANSI driver writes directly to Video Memory, it is imperative that this function be called so that it can set internal variables that tells it where the cursor is, the color attribute to use when displaying characters and the Segment address of Video Memory. You should call this function anytime the Screen is changed in size (i.e., from 25 to 43 line mode). The ANSI driver always protects the bottom row of the screen. In other words, it will not allow text to be written there using Gputc or Gputs. If you need to write to the bottom screen row, use the Clarion SHOW function. The color parameter is a standard IBM color code in the range of 0 to 255. The Color codes are described in the Clarion Language Reference Manual in the Video and Keyboard Chapter. You must pass the COM port number that the ANSI driver will be associated with. The ANSI Cursor Position Report (CPR) sequence is issued whenever the driver receives a Device Status Report (DSR) command. The CPR sequence is sent out the COM port. Since there is only one screen and one ANSI driver, the driver must know which port to use. The DSR/CPR Page 62 GAP Communications CLACOM sequences are generally only used by BBS programs to determine if the caller has ANSI capability. Return Value None. Example MaxRows SHORT MaxCols SHORT MaxRows = ROWS() ! Get Max Number of Rows MaxCols = COLS() ! Get Max Number of Columns SetCursor(1,1) ! Cursor to top of screen InitAnsi(0,MaxRows,MaxCols,14) ! Initialize ANSI driver Page 63 GAP Communications CLACOM InitPort ----------------------------------------------------------------- Purpose Initialize port to baud, data, parity, and stop bits. InitPort(port, baud, parity, data, stop) SHORT port COM Port Number LONG baud BPS rate SHORT parity 0 = None, 1 = Odd, 2 = Even SHORT data 6, 7, or 8 data bits SHORT stop 1 or 2 stop bits Type Function - Returns SHORT Description Sets the communications port to the parity, data bits, stop bits, and baud rate. This function should only be used when the Communications Interface is set to Standard. Don't call when interfacing with a DigiBoard. _ Return Value 0 = Successful. 1 = Port Not Initialized. 2 = Invalid Parameter. Example if InitPort(0,38400,0,8,1) ! Initialize COM 1 ShowError('Unable To Initialize Port') ! N,8,1 - 38,400 bps end Page 64 GAP Communications CLACOM Int14Set ----------------------------------------------------------------- Purpose Initialize Digi port to baud, parity, data, and stop bits. DsetUp(channel, baud, parity, data, stop) SHORT channel Channel Number (port) LONG baud BPS rate SHORT parity 0 = None, 1 = Odd, 2 = Even SHORT data 6, 7, or 8 data bits SHORT stop 1 or 2 stop bits Type Function - Returns SHORT Description When using a Communications Interface set to Int14/EBIOS, this function initializes the specified port (Channel) on the DigiBoard. This interface requires that the end user have the DigiBoard supplied Universal DOS Driver installed as a TSR. The channel is the Communications Port to use on the DigiBoard. This should be 4 - 19. Return Value 0 = Successful. 1 = Device Driver not installed or DigiBoard not installed. 2 = EBIOS not configured. 3 = Invalid Parameter passed. Example ! set up 1st port on DigiBoard (Channel = 4) if Int14Set(4,38400,0,8,1) ShowError('Unable To Initialize DigiBoard') end Page 65 GAP Communications CLACOM Iscd ----------------------------------------------------------------- Purpose Check for Carrier on the Communications Port. Iscd(port) SHORT port COM Port Number Type Function - Returns SHORT Description This function allows you to test the communications port for a remote carrier signal. Return Value Returns 0 if there is no carrier and 1 if there is a carrier. Example if Iscd(0) ! is there a carrier? online = 1 show(MaxRows,MaxCols - 7,' OnLine') else online = 0 show(MaxRows,MaxCols - 7,'OffLine') end Page 66 GAP Communications CLACOM IsRing ----------------------------------------------------------------- Purpose Check to see if the Phone is Ringing. IsRing(port) SHORT port COM Port Number Type Function - Returns SHORT Description This function allows you check to see if the Phone is Ringing. Return Value Returns 0 if the phone is not ringing, 1 if it is. Example port SHORT cstr CSTRING port = 0 ! Use COM 1 cstr = 'ATA' ! Answer Phone string if IsRing(0) ! is there a carrier? ComPuts(port,cstr) ! Tell Modem to Answer end Page 67 GAP Communications CLACOM LineStat ----------------------------------------------------------------- Purpose Returns UART Line Status. LineStat(port) SHORT port COM Port Number Type Function - Returns BYTE Description Returns the value of the Line Status Register. Note that the value returned is the contents of the Line Status Register at the time the last Line Status Interrupt occured. This information will tell you if there was a Receiver Overrun, Parity, or Framing error. The value is a Bit Flag. The bits have the following meanings: 1 - Overrun Error 2 - Parity Error 3 - Framing Error If a bit is on, it is set to a 1. If it is off, it is set to a 0. To test if a bit is on you use the Clarion BAND function. Return Value Bit Flag containing Line Status. Example linstat BYTE linstat = LineStat(0) ! get Line Status if BAND(linstat,02h) ! check for Overrun ! Lost some incomming data end Page 68 GAP Communications CLACOM ModemPuts ----------------------------------------------------------------- Purpose Sends a Command String to a Modem. ModemPuts(port, str) SHORT port COM Port Number CSTRING str String to send Type Procedure Description Will send a string of characters out the communications port. This function is generally used to send commands to a modem. It is identical to ComPuts except that it interprets and acts upon certain characters. The special characters are: ^M - Send a Carriage Return ~ - Tilde. Pause for 1/2 second Note that the special characters are not sent to the modem. Also note that in order for a modem to accept commands, the modem must be "offline" (not connected to a remote modem) and DTR must be set : Dtr(0,1). Return Value None. Example cstr CSTRING(100) cstr = 'ATZ^M~~' ! Modem Reset String ! The above string will send the Modem Reset String followed ! by a Carriage Return. It will wait 1 second after sending ! the string. ModemPuts(0,cstr) ! Send Modem Command Page 69 GAP Communications CLACOM ModemStat ----------------------------------------------------------------- Purpose Returns Status of the attached Modem. ModemStat(port) SHORT port COM Port Number Type Function - Returns BYTE Description Returns the value of the Modem Status Register. The value is a Bit Flag. The bits have the following meanings: 4 - CTS (Clear To Send) 5 - DSR (Data Set Ready) 6 - RI (Ring Indicator) 7 - RLSD (Carrier Detect) If a bit is on, it is set to a 1. If it is off, it is set to a 0. To test if a bit is on you use the Clarion BAND function. Return Value Bit Flag containing Modem Status. Example modstat BYTE modstat = ModemStat(0) ! get Modem Status if BAND(Modstat,080h) ! check for Carrier online = 1 ! got one, set flag else online = 0 ! no carrier, reset flag end Page 70 GAP Communications CLACOM PeekChr ----------------------------------------------------------------- Purpose Checks if character is in Receive Buffer. PeekChr(port, chr) SHORT port COM Port Number BYTE chr Character to check for Type Function - Returns SHORT Description This function checks the Receiver Buffer to see if it contains a certain character. Return Value 0 if character not in buffer, 1 if it is. Example port SHORT port = 0 ! use COM 1 if PeekChr(port,10) ! check for Line Feed ! there is a Line Feed in the Buffer end Page 71 GAP Communications CLACOM PosCursor ----------------------------------------------------------------- Purpose Restore ANSI Driver Cursor Position. PosCursor() Type Procedure Description When opening a window and then closing it, Clarion does not put the cursor back where it was prior to opening the window. This doesn't cause any problems because the ANSI driver maintains its own internal cursor position. However, the screen will look a bit strange if the cursor is "hanging" in the middle of the screen when it should be on row 2, column 10. Return Value None. Example PosCursor() ! Put Cursor back Page 72 GAP Communications CLACOM RecvCount ----------------------------------------------------------------- Purpose Gets number of characters in Receive Buffer. RecvCount(port) SHORT port COM Port Number Type Function - Returns USHORT Description This function returns the number of characters in the Receive Buffer waiting to be read. Return Value Number of characters in Receive Buffer. Example port SHORT numchrs USHORT port = 0 ! use COM 1 numchrs = RecvCount(port) ! get # of chars Page 73 GAP Communications CLACOM ResetPort ----------------------------------------------------------------- Purpose Restores the Communications port. ResetPort(port) SHORT port COM Port Number Type Procedure Description This function must be called prior to exiting the program or anytime you are finished with the Com Port. It restores the interrupt vector used by the Standard Communications routines. It is imperative that when using the Standard Interface you call this function when you no longer wish to access the Serial Port. The Standard Interface sets up an interrupt vector for the port and if this vector is not restored prior to exiting your program, the computer will ultimately crash. This function should only be used when the Communications Interface is set to Standard. Don't call when interfacing with a DigiBoard. _ Return Value None. Example ResetPort(0) ! Reset COM 1 Page 74 GAP Communications CLACOM RestCbreak ----------------------------------------------------------------- Purpose Restores the Ctrl-Break vector. RestCbreak() Type Procedure Description This function must be called prior to exiting the program. It restores the interrupt vector used by the Ctrl-Break routine. If you set up a Ctrl-Break handler at the beginning of your program, you should call this function from a SHUTDOWN procedure. Setting up a SHUTDOWN procedure insures that the Ctrl-Break vector is restored prior to program termination. Return Value None. Example RestCbreak() ! restore Ctrl-Break Page 75 GAP Communications CLACOM Rts ----------------------------------------------------------------- Purpose Toggle the RTS line on or off. Rts(port, how) SHORT port COM Port Number SHORT how 0 = Turn RTS off 1 = Turn RTS on Type Procedure Description This routine is used to turn the Request To Send line of the communications port on or off. Turning RTS off (providing the modem supports hardware handshaking) tells the modem to stop sending data to the computer. It is typically toggled off while writing a buffer of data to a disk. Return Value None. Example Rts(0,0) ! Turn RTS off Page 76 GAP Communications CLACOM Rxempty ----------------------------------------------------------------- Purpose To check if there are any characters in the receive buffer. Rxempty(port) SHORT port COM Port Number Type Function - Returns SHORT Description This function checks the communications receive buffer to see if there are any characters waiting to be read. Return Value Returns 1 if buffer is empty, 0 if there are characters waiting to be read. Example while Rxempty(0) ! nothing happening end ! wait for something Page 77 GAP Communications CLACOM SendBreak ----------------------------------------------------------------- Purpose Sends a Break Signal to Modem. SendBreak(port) SHORT port COM Port Number Type Procedure Description Will send a Break Signal to the Modem. This function is most often used with high speed modems that have their own transmit buffer and you wish to clear the buffer. These modems can be configured to empty their buffer upon receipt of a break signal. Note that some modems do not react too well to a break signal. Whether or not to send a break to the modem so that you can clear its transmit buffer should be a configuration option. Return Value None. Example SendBreak(0) ! Send a Break to Modem Page 78 GAP Communications CLACOM SendZmodem ----------------------------------------------------------------- Purpose Sends one or more files using Zmodem. SendZmodem(port, filename, statfunc) SHORT port COM Port Number CSTRING filename Name of file to upload SHORT statfunc 0 or 1 (see below) Type Function - Returns SHORT Description This function allows you to send one or more files to a remote computer using the Zmodem Protocol. Filename is a CSTRING containing the name of the file to upload. It may contain a Wild Card Specification to send more than one file at a time. The statfunc parameter allows you to override the default Transfer Status Window. A value of 0 means the internal window will be displayed and updated. A value of 1 means you will open your own window and the transfer statistics will be displayed on it instead. Return Value 0 for successful transfer. If an error occurs, the following values are returned: 1 - Error opening file 4 - Time out 2 - Receiver cancelled 5 - No carrier 3 - Sender cancelled Example cstr CSTRING(100) cstr = 'FILE.ZIP' ! send a single file SendZmodem(0,cstr,0) cstr = '*.ZIP' ! send all the ZIP files SendZmodem(0,cstr,0) Page 79 GAP Communications CLACOM SendZmodem1 ----------------------------------------------------------------- Purpose Sends one or more files using Zmodem. SendZmodem1(port, filename, path, flag, statfunc) SHORT port COM Port Number CSTRING filename Name of file to upload CSTRING path Path of file to upload SHORT flag Control Flag SHORT statfunc 0 or 1 (see below) Type Function - Returns SHORT Description This is an alternate Zmodem send function that allows you to control the file sends according to your needs. This is especially useful if you need to send more than one file and the files are not all in the same directory. Filename is a CSTRING containing the name of the file to upload. It may not be a Wild Card Specification. Path is a CSTRING containing the full path to where the file is located. It should be in the form of "C:\FILES", without a trailing slash. Flag is defined as follows: 0 = This is the First File in the Batch. >0 = This is the Second and Subsequent File. -1 = End the Batch (no more files to send). You must always end the batch with Zmodem. If you have only one file to send, you would call this function twice. If you have three files to send, you would call this function four times. Generally you call this function from within a loop where the control variable is passed as the flag parameter. After all files are sent, you then call SendZmodem1 with a flag value of -1. The statfunc parameter allows you to override the default Transfer Status Window. A value of 0 means the internal window will be displayed and updated. Page 80 GAP Communications CLACOM A value of 1 means you will open your own window and the transfer statistics will be displayed on it instead. Return Value 0 for successful transfer. If an error occurs, the following values are returned: 1 - Error opening file 4 - Time out 2 - Receiver cancelled 5 - No carrier 3 - Sender cancelled Example r SHORT fname CSTRING(100) fpath CSTRING(160) Loop r = 0 To 3 ! 4 files to send fname = Clip(files[r+1]) ! get file name fpath = Clip(filepath[r+1]) ! get file's path If SendZmodem1(port,fname,fpath,r,0) NOT= 0 Break End End r = SendZmodem1(port,fname,fpath,-1,0) ! end the Batch Page 81 GAP Communications CLACOM SetCapture ----------------------------------------------------------------- Purpose Turns Capture Buffer On or Off. SetCapture(how) SHORT how 0 = Turn Capture Buffer off 1 = Turn Capture Buffer on Type Function - Returns SHORT Description Turns automatic data capturing on or off. When the capture buffer is on, any data sent to the screen using Gputc or Gputs will also be stored in the capture buffer (ANSI sequences are stripped). The capture buffer is capable of holding 64k of data. When the buffer becomes full, it is automatically written to a disk file. Whenever you need to view the capture buffer, you should first flush the buffer to disk by calling SetCapture with a parameter of 0. Be sure to turn the buffer back on when you are ready to capture more data. Return Value 0 if memory for the buffer was successfully allocated, 1 if there is insufficient memory. Page 82 GAP Communications CLACOM Example ScrFile CSTRING(64) ! Name of ScrollBack File ! set up an automatic Scroll Back Buffer ScrFile = 'GTERM$$.CAP' ! Give Scroll File a name Do TurnOnCapture ! Turn on Capture ..... ! your program code here ! end of procedure, close Scroll Back Buffer retchr = SetCapture(0) ! Turn Capture Off Return ! Return from Procedure TurnOnCapture Routine ! Turn on Capture SetCaptureFile(ScrFile) ! Name of file if SetCapture(1) ! and turn on Capture Open(CaptureErr) ! No Memory bell() ! make noise Accept ! tell um Close(CaptureErr) ! close error screen end Exit ! Return from Routine Page 83 GAP Communications CLACOM SetCaptureFile ----------------------------------------------------------------- Purpose Names the Capture Buffer File. SetCaptureFile(filename) CSTRING filename Name to use for Capture File Type Procedure Description Names the file that will be used to store captured data. Return Value None. Example See the example for SetCapture. Page 84 GAP Communications CLACOM SetCbreak ----------------------------------------------------------------- Purpose Initializes the Ctrl-Break vector. SetCbreak() Type Procedure Description To trap Ctrl-C and Ctrl-Break, this function should be called to set up an interrupt service routine to trap these two keys. It is imperative that the program not exit before calling RestCbreak so that the interrupt vector can be restored. When using the Standard Communications Interface, a Ctrl-Break vector must be installed to prevent a user from breaking out of your program before you've had a chance to restore the Communications Interrupt vector. Return Value None. Example SetCbreak() ! set up Ctrl-Break ISR Page 85 GAP Communications CLACOM SetPort ----------------------------------------------------------------- Purpose Initialize the Communications Port. SetPort(irq, base, port) SHORT irq Port IRQ to use SHORT base Port Base Address to use SHORT port Com Port Number Type Function - Returns SHORT Description This is the port initialization routine that must be called when using the Standard Interface. It must be called prior to any port I/O calls. IRQ is the Interrupt Request number to use for the port. Base Address is the address where the port is located. Port is the COM port number, where COM1 = 0, COM2 = 1, COM3 = 2, and COM4 = 3. For COM 1 and COM 2, you may simply pass 0 as the IRQ and Base address since the defaults for these ports will be used. Note that the Communications Routines always use hardware handshaking (unless the nocts flag is set to 1). This means that if CTS is not active, the output routines will not be able to send a character out the serial port. CTS is normally controlled by a Modem, however when not using a modem, the serial cable must be wired so that CTS on one end of the connection is tied to RTS on the other end. See Appendix B for a diagram of a NULL _ Modem cable. Return Value 0 = successful. 1 = No UART found at Port Address. 2 = Clear To Send (CTS) is not active. Example ! Set Up Port on COM1 if SetPort(0,0,0) ShowError('Unable To Initialize Port') end Page 86 GAP Communications CLACOM StrHex ----------------------------------------------------------------- Purpose Converts a Hexadecimal string to an Unsigned Short. StrHex(hexstring) CSTRING hexstring String containing Hex digits Type Function - Returns USHORT Description This function will convert a string containing hexadecimal digits and return the value of that string as an unsigned short. It is most often used to convert Memory Addresses stored as a string to a number that can be utilized by the port initialization routines. Return Value 0 if string could not be converted, number if it could. Example cstr CSTRING(100) hexnum USHORT cstr = 'D800' ! Base Address hexnum = StrHex(cstr) ! as a number Page 87 GAP Communications CLACOM StrWord ----------------------------------------------------------------- Purpose Check if one string contains another string. StrWord(srcstring, substring) CSTRING srcstring String to search CSTRING substring String to search for Type Function - Returns SHORT Description Clarion's INSTRING function doesn't work very well with C strings (in fact, it doesn't work at all). The terminating NULL seems to be included as part of the search value. StrWord will search for a string to see if it is contained within another string. Both strings must be of type CSTRING. If the larger string contains the smaller string, the position in the larger string where the smaller string begins will be returned. Note that the strings are compared without regard to case. Return Value 0 if substring not found, otherwise position in source string where the substring starts. Example srcstring CSTRING(100) substring CSTRING(10) scrstring = 'This is a string' substring = 'string' if StrWord(srcstring,substring) ! srcstring contains substring else ! substring not found end Page 88 GAP Communications CLACOM Timer ----------------------------------------------------------------- Purpose Pauses for the number of "ticks" specified. Timer(ticks) SHORT ticks Number of timer ticks to pause Type Procedure Description This function allows you to pause all processing for the specified number of ticks. It is in- sensitive to processor speed. The function simply delays the number of "ticks" indicated by the passed parameter. Each tick is 1/18 of a second (or 55 milliseconds). Return Value None. Example Timer(18) ! pause for 1 second Page 89 GAP Communications CLACOM UpLoad ----------------------------------------------------------------- Purpose Sends one or more files. UpLoad(port, protocol, filename, statfunc) SHORT port COM Port Number SHORT protocol Number of protocol to use _ CSTRING filename Name of file to upload SHORT statfunc 0 or 1 (see below) Type Function - Returns SHORT Description This function allows you to send a file to a remote computer. The protocols are defined as follows: 0 = ASCII 3 = 1K Xmodem-G 1 = Xmodem 4 = Ymodem 2 = 1K Xmodem 5 = Ymodem-G Filename is a CSTRING containing the name of the file to upload. If the protocol is a batch protocol (Ymodem or Ymodem-G) then you may pass a Wild Card Specification to send more than one file at a time. The statfunc parameter allows you to override the default Transfer Status Window. A value of 0 means the internal window will be displayed and updated. A value of 1 means you will open your own window and the transfer statistics will be displayed on it instead. Return Value 0 for successful transfer. If an error occurs, the following values are returned: 1 - Error opening file 4 - Time out 2 - Receiver cancelled 5 - No carrier 3 - Sender cancelled 6 - Error reading file Page 90 GAP Communications CLACOM Example cstr CSTRING(100) cstr = 'FILE.ZIP' ! send a single file UpLoad(0,2,cstr,0) ! using 1K Xmodem cstr = '*.ZIP' ! send all the ZIP files UpLoad(0,4,cstr,0) ! using Ymodem Page 91 GAP Communications CLACOM Appendix A GetKeyc obtains keyboard input by making calls to the Computer BIOS. The BIOS translates keyboard scan codes into unique codes. Any code returned by GetKeyc that is less than or equal to 127 is a regular ASCII character. Codes in the range of 128 to 255 are IBM enhanced ASCII characters. These codes are returned "as is" (no translations are performed upon them). Key Codes greater than 255 present a problem. These are extended keys and include the function keys, cursor keys, and the Ctrl and Alt key combinations. The BIOS returns the scan code of these keys. The problem is that the scan code can lie in the range of ASCII characters (0 through 255). In order to distinguish between a displayable ASCII character and an extended key (F1, Home, PgDn, Alt-Equal, etc), GetKeyc adds 256 to the key code returned by the BIOS. The following tables show the extended key codes as well as Control Key combinations (which are used extensively in communications). Page 92 GAP Communications CLACOM Control Keys and Extended Keys in Numerical Order: Ctrl-A 1 Alt-S 287 Shift-F9 348 Ctrl-B 2 Alt-D 288 Shift-F10 349 Ctrl-C 3 Alt-F 289 Ctrl-F1 350 Ctrl-D 4 Alt-G 290 Ctrl-F2 351 Ctrl-E 5 Alt-H 291 Ctrl-F3 352 Ctrl-F 6 Alt-J 292 Ctrl-F4 353 Ctrl-G 7 Alt-K 293 Ctrl-F5 354 Backspace 8 Alt-L 294 Ctrl-F6 355 Ctrl-H 8 Alt-Z 300 Ctrl-F7 356 Ctrl-I 9 Alt-X 301 Ctrl-F8 357 Tab 9 Alt-C 302 Ctrl-F9 358 Ctrl-J 10 Alt-V 303 Ctrl-F10 359 LineFeed 10 Alt-B 304 Alt-F1 360 Ctrl-K 11 Alt-N 305 Alt-F2 361 Ctrl-L 12 Alt-M 306 Alt-F3 362 Ctrl-M 13 F1 315 Alt-F4 363 Enter 13 F2 316 Alt-F5 364 Ctrl-N 14 F3 317 Alt-F6 365 Ctrl-O 15 F4 318 Alt-F7 366 Ctrl-P 16 F5 319 Alt-F8 367 Ctrl-Q 17 F6 320 Alt-F9 368 Ctrl-R 18 F7 321 Alt-F10 369 Ctrl-S 19 F8 322 Ctrl-PrintScreen 370 Ctrl-T 20 F9 323 Ctrl-CursorLeft 371 Ctrl-U 21 F10 324 Ctrl-CursorRight 372 Ctrl-V 22 Home 327 Ctrl-End 373 Ctrl-W 23 CursorUp 328 Ctrl-PgDn 374 Ctrl-X 24 PgUp 329 Ctrl-Home 375 Ctrl-Y 25 CursorLeft 331 Alt-1 376 Ctrl-Z 26 CursorRight 333 Alt-2 377 Escape 27 End 335 Alt-3 378 BackTab 271 CursorDown 336 Alt-4 379 Alt-Q 272 PgDn 337 Alt-5 380 Alt-W 273 Insert 338 Alt-6 381 Alt-E 274 Delete 339 Alt-7 382 Alt-R 275 Shift-F1 340 Alt-8 383 Alt-T 276 Shift-F2 341 Alt-9 384 Alt-Y 277 Shift-F3 342 Alt-0 385 Alt-U 278 Shift-F4 343 Alt-Hyphen 386 Alt-I 279 Shift-F5 344 Alt-Equal 387 Alt-O 280 Shift-F6 345 Ctrl-PgUp 388 Alt-P 281 Shift-F7 346 Alt-A 286 Shift-F8 347 Page 93 GAP Communications CLACOM Control Keys and Extended Keys in Alphabetical Order: Alt-0 385 Alt-V 303 Ctrl-T 20 Alt-1 376 Alt-W 273 Ctrl-U 21 Alt-2 377 Alt-X 301 Ctrl-V 22 Alt-3 378 Alt-Y 277 Ctrl-W 23 Alt-4 379 Alt-Z 300 Ctrl-X 24 Alt-5 380 Backspace 8 Ctrl-Y 25 Alt-6 381 BackTab 271 Ctrl-Z 26 Alt-7 382 Ctrl-A 1 CursorDown 336 Alt-8 383 Ctrl-B 2 CursorLeft 331 Alt-9 384 Ctrl-C 3 CursorRight 333 Alt-A 286 Ctrl-CLeft 371 CursorUp 328 Alt-B 304 Ctrl-CRight 372 Delete 339 Alt-C 302 Ctrl-D 4 End 335 Alt-D 288 Ctrl-E 5 Enter 13 Alt-E 274 Ctrl-End 373 Escape 27 Alt-Equal 387 Ctrl-F 6 F1 315 Alt-F 289 Ctrl-F1 350 F10 324 Alt-F1 360 Ctrl-F10 359 F2 316 Alt-F10 369 Ctrl-F2 351 F3 317 Alt-F2 361 Ctrl-F3 352 F4 318 Alt-F3 362 Ctrl-F4 353 F5 319 Alt-F4 363 Ctrl-F5 354 F6 320 Alt-F5 364 Ctrl-F6 355 F7 321 Alt-F6 365 Ctrl-F7 356 F8 322 Alt-F7 366 Ctrl-F8 357 F9 323 Alt-F8 367 Ctrl-F9 358 Home 327 Alt-F9 368 Ctrl-G 7 Insert 338 Alt-G 290 Ctrl-H 8 LineFeed 10 Alt-H 291 Ctrl-Home 375 PgDn 337 Alt-Hyphen 386 Ctrl-I 9 PgUp 329 Alt-I 279 Ctrl-J 10 Shift-F1 340 Alt-J 292 Ctrl-K 11 Shift-F10 349 Alt-K 293 Ctrl-L 12 Shift-F2 341 Alt-L 294 Ctrl-M 13 Shift-F3 342 Alt-M 306 Ctrl-N 14 Shift-F4 343 Alt-N 305 Ctrl-O 15 Shift-F5 344 Alt-O 280 Ctrl-P 16 Shift-F6 345 Alt-P 281 Ctrl-PgDn 374 Shift-F7 346 Alt-Q 272 Ctrl-PgUp 388 Shift-F8 347 Alt-R 275 Ctrl-PrtScr 370 Shift-F9 348 Alt-S 287 Ctrl-Q 17 Tab 9 Alt-T 276 Ctrl-R 18 Alt-U 278 Ctrl-S 19 Page 94 GAP Communications CLACOM Appendix B Most of the Null Modem connectors and cables that are commercially available are wired incorrectly. Sounds unbelievable, but true. They are wired using yesterday's technology. Modern day modems are intelligent devices. They are capable of telling the Host Computer when to stop sending data and are able to determine when the computer needs to have data sent to it temporarily suspended. This concept is known as Hardware Flow Control (CTS/RTS checking). CLACOM was written with Hardware Flow Control in mind. No characters will be sent to the communications port if the port is unable to accept new characters. This prevents loss of data and insures a reliable connection. Most NULL Modems are wired with the CTS/RTS lines either always off or always on. If you are hardwiring computers together via a NULL Modem, you will probably have to change some of the wiring on the connectors. You can either make your own NULL Modem or purchase one. If you purchase one, be sure that you can remove the connector shields to gain access to the wiring. The following diagram shows a properly wired NULL Modem: SCREEN NOT AVAILABLE IN TEXT BASED DOCUMENTATION SEE PRINTED MANUAL Page 95 GAP Communications CLACOM Index Ansi driver 5, 21, 22, 29, 32, 59, 61, 62, 73 Initializing 15, 32, 63 ASCII File Transfers 31 Asciidel 31 ASK 57 Base Address 11, 87 Baud Rate 5, 48, 52, 65, 66, 87 Capture 26, 83 Channel 11, 12, 52, 53, 66 Characters In Receive Buffer 72, 74 Sending to com port 19, 32, 43 Sending to local screen 19, 32, 61 Characters Per Second Uploading & Downloading 23 CkeyPress 32, 35 Clarion ASK 57 Color 63 CSTRING 34, 44, 49, 53, 54, 62, 70, 80, 88, 89, 91 Cursor 73 Export File 8 INSTRING 89 KEYCODE 13, 57 Overlays 8 Protected Mode 8, 16 Screen 73 Screen Buffer 22, 58 SHOW 63 Strings 89 TYPE 29 Type Checking 34 ClrBuf 32, 36 Color 31, 63 Combufsiz 31 ComGetb 37 ComGetc 21, 32, 38 ComGetd 32, 39 ComGets 32, 40 Communications Base address 15, 87 Baud rates 5, 15, 87 Buffer 31 Page 96 GAP Communications CLACOM Carrier 67 CTS 31, 87 DigiBoard 10, 15, 65, 75 FIFO buffer 5, 15 Disabling 31 Initializing 15, 48, 52, 65, 66, 87 Input 37, 38, 39, 40, 78 Interface 10, 65, 75 Interrupt 8, 15, 75 IRQ 87 nocts flag 87 Output 42, 43, 44, 70 Port 10, 15, 87 ComPutb 32, 42 ComPutc 22, 32, 43 ComPuts 22, 32, 44 CPS Uploading & Downloading 23 Crash 8, 16, 75 CRC 55, 56 Crscur 31 CSTRING 34, 44, 49, 53, 54, 62, 70, 80, 88, 89, 91 Ctrl-Break handler 8, 76, 86 CTS 31, 87 Cursor 32, 45, 73 Setting position of 31 CursorOff 32, 45 CursorOn 32, 45 DclrTx 32, 46 Delaying 90 DgtTxfree 32, 47 DigiBoard 10, 65, 75 Channel 11, 12, 52, 53, 66 Initializing Port 15, 48, 52, 66 Resetting Modem 51 Transmit Buffer 46 Free Space 47 Distribution files 6 Dmodem 32, 48 DownLoad 32, 49 Downloading Files 23, 31, 49, 60 Errors 49, 60 Drestore 32, 51 DsetUp 15, 32, 52 Dtr 32, 54 Errors Download 49, 60 Exception 8 Page 97 GAP Communications CLACOM Overrun, Parity 69 Upload 80, 82 Exception Error 8 Export File 8 FIFO buffer 5, 15 Disabling 31 File Transfer Statistics 23, 31 Files Capture 26, 83 Downloading 23, 31, 49, 60 Uploading 23, 31, 80, 91 Functions CkeyPress 35 ClrBuf 36 ComGetb 37 ComGetc 21, 38 ComGetd 39 ComGets 40 ComPutb 42 ComPutc 22, 43 ComPuts 22, 44 CursorOff 45 CursorOn 45 DclrTx 46 DgtTxfree 47 Dmodem 48 DownLoad 49 Drestore 51 DsetUp 15, 52 Dtr 54 GetCRC16 55 GetCRC32 56 GetKeyc 13, 57, 93 GetScrn 58 GetZmodem 60 Gputc 21, 58, 61, 63 Gputs 21, 58, 62, 63 InitAnsi 15, 63 InitPort 15, 65 INSTRING 89 Int14Set 15, 66 Iscd 67 IsRing 68 LineStat 69 ModemPuts 70 ModemStat 71 PeekChr 72 PosCursor 73 Page 98 GAP Communications CLACOM RecvCount 74 ResetPort 75 RestCbreak 76 Rts 77 Rxempty 78 SendBreak 79 SendZmodem 80 SendZmodem1 81 SetCapture 26, 83 SetCaptureFile 26, 85 SetCbreak 86 SETPATH 60 SetPort 15, 87 SHOW 63 SHUTDOWN 76 StrHex 53, 88 StrWord 89 Timer 90 UpLoad 91 GetCRC16 32, 55 GetCRC32 32, 56 GetKeyc 13, 32, 57, 93 GetScrn 32, 58 GetZmodem 32, 60 Global Variables 31 asciidel 31 combufsiz 31 crscur 31 gnormal 31 meterchr 31 noascmes 31 nocts 31 usefifo 31 Gnormal 31 Gputc 21, 32, 58, 61, 63 Gputs 21, 32, 58, 62, 63 Hardware Handshaking 31, 87 InitAnsi 15, 32, 63 Initializing ANSI driver 63 Interrupt handlers 87 InitPort 15, 32, 65 Input From com port 19, 32, 37, 38, 39, 40, 78 From local & remote 19, 35 From local keyboard 13, 19, 32, 57, 93 INSTRING 89 Int14Set 15, 32, 66 Page 99 GAP Communications CLACOM Interrupt handlers Communications 8, 15, 75 Ctrl-Break 8, 76, 86 IRQ 11, 87 Iscd 32, 67 IsRing 68 Keyboard 13, 19, 35, 57, 93 Clarion Key Codes 13, 57 KEYCODE 13, 57 Line Status Register 69 LineStat 32, 69 Lockup 8, 16, 75 Meterchr 31 Modem 51, 54, 65, 96 Clearing buffer 79 Sending strings to 70 ModemPuts 32, 70 ModemStat 32, 71 Noascmes 31 Nocts 31 Nocts flag 87 NULL Modem 87, 96 Output To com port 19, 32, 42, 43, 44 To local screen 19, 32, 61, 62 To modem 70 Overlays 8, 16 Parity Error 69 Pausing 90 PeekChr 32, 72 Phone Ringing 68 Port 10, 15, 48, 65, 87 PosCursor 32, 73 Program Crashing 8, 16 Progress Meter 31 Protected Mode 8, 16 Protocols 5, 23, 28, 30, 49, 60, 91 External 28, 30 Receive buffer 32, 35, 36, 38, 39, 78, 87 Checking for a Character 72 Number of characters in 74 Setting size of 31 Receiver Overrun 69 RecvCount 32, 74 RESETDIG.EXE 10, 12, 52, 53 ResetPort 32, 75 Page 100 GAP Communications CLACOM RestCbreak 32, 76 Ring 68 Rts 32, 77, 87 Rxempty 32, 78 Scan codes 57 Screen 32, 58, 61, 62, 63, 73 Clearing 61 Color 63 Columns 63 Cursor 31, 45 Output 19 Rows 63 Screen Buffer 22, 58 Scroll Back Buffer 26, 83 SendBreak 32, 79 SendZmodem 32, 80 SendZmodem1 32, 81 SetCapture 26, 32, 83 SetCaptureFile 26, 32, 85 SetCbreak 32, 86 SETPATH 60 SetPort 15, 32, 87 SHOW 63 SHUTDOWN 76 Standard Interface 10, 15, 65, 75, 87 Statistics File Transfer 23, 31 StrHex 33, 53, 88 Strings 89 Hexadecimal 53 INSTRING 89 Receiving 37, 40 Sending to com port 32, 44, 70 Sending to local screen 32, 62 Sub string 89 StrWord 33, 89 Timer 33, 90 Transfer Window 23 Transmit Buffer 32, 46 Free Space 47 TYPE 29 UpLoad 33, 91 Uploading Files 23, 31, 80, 91 Errors 80, 82 Usefifo 31 Variables Global 31 Video Memory 16, 58 Page 101 GAP Communications CLACOM Xmodem 5, 23, 32, 33, 49, 50, 91 XTRACE 8, 16 Ymodem 5, 23, 32, 33, 49, 50, 91 Zmodem 5, 23, 60, 80 Page 102